1

很久之前写的一篇文章,最近有用到又重新研究了一下,顺手发上来。

打算开始学习机器学习,先看到的是KNN算法(K近邻算法)。首先是关于knn算法的原理的一段文字描述,对它有个最初的认识:

假设我们有一堆分好类的样本数据,分好类表示每个样本都有自己的一个标签,当出现一个测试样本需要我们判断它该属于那个类别时,我们就分别计算出它到每个样本之间的距离,然后取离测试样本最近的K个样本标签进行投票,得票数最多得那个标签就是测试样本得标签。

下面就用python代码一步步得实现上面所描述得原理:

from numpy import *
import operator

首先我们需要一堆分好类得样本数据,那我们就用新建这样得一些样本数据,python代码如下:

def createDataSet(): 
    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) 
    labels = ['A','A','B','B'] 
    return group, labels 

上面的代码一共分了A和B两类,每个类别分别有两个样本,等下我们会分别计算被测样本到每个已知样本的距离,然后使用KNN算法。下面这段代码就是进行分类投票的:

def classify0(inX, dataSet, labels, k): 
    dataSetSize = dataSet.shape[0]#shape 函数返回这个数组的行数和列数 
    diffMat = tile(inX, (dataSetSize,1)) - dataSet#tile函数根据第二个参数来扩充数组    
    sqDiffMat = diffMat**2 sqDistances = sqDiffMat.sum(axis=1) 
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()#argsort函数返回按照升序排序的数组下标的一个数组 
    classCount = {} 
    for i in range(k):#这里主要进行投票 
        voteIlabel = labels[sortedDistIndicies[i]] 
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 
    sortedClassCount = sorted(classCount.iteritems(),
     key=operator.itemgetter(1),reverse=True)      
    return sortedClassCount[0][0] 

那如何使用这个东西呢,我们只需要先构造样本数据:

group, labels = kNN.createDataSet()

然后进行投票测试:

kNN.classify0([0,0],group,labels ,3)

这个函数第一个参数未知分类的样本的坐标,第二个参数就是已知分类的样本,第三个就是分类,第四个参数就是K,经过排序之后我们需要获取前k个距离样本进行投票测试。
这个例子只是对kNN算法的一个小试牛刀,但是区区十几行代码,却能阐述出一种分类的思想,确实是很强大的。

参考:

《Machine Leaning in Action》


Tairy
3.1k 声望404 粉丝

一介书生